package com.xl.xlserver.gameServer;

import com.xl.xlserver.GameUtilEntity.Play;
import com.xl.xlserver.mode.login.InitMode;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelId;
import io.netty.channel.socket.SocketChannel;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;

public class LobbyManager {

    Logger logger = LoggerFactory.getLogger(InitMode.class);
    private static LobbyManager lobbyManager = null;

//    /**
//     * 协议管理器
//     */
//    public static Map<Integer,Processors> protocolManager;

    /**
     * 客户端连接管理器
     */
    public static Map<String, Channel> gateManager = new HashMap<>();

    /**
     * 用户管理器
     */
    public static Map<String,Object> userManager = new HashMap<>();
//
    /**
     * 玩家管理器
     */
    public static Map<String, Play> playerManager = new HashMap<>();


    public static  Map<String,String> session = new HashMap<>();

    public void init(){
//        protocolManager = LobbyProtocol.toMap();
       // gateManager = new HashMap<String, Channel>();
//        sessionManager = new HashMap<String,LobbyGameSession>();
//        playerManager = new HashMap<String,Player>();
        System.out.println("初始化管理器成功！");
    }




    /**
     * 单例模式
     * @return
     */
    public static synchronized LobbyManager getInstance(){
        if(lobbyManager == null){
            lobbyManager = new LobbyManager();
        }
        return lobbyManager;
    }

    /**
     * 将新获取的连接增加到gateManager中
     * @param channelId
     * @param channelHandlerContext
     */
    public synchronized void addChannel(String channelId, ChannelHandlerContext channelHandlerContext){
        //直接put 如果已经存在相当于其他地方登录，直接覆盖
        if(channelHandlerContext != null){
            gateManager.put(channelId, channelHandlerContext.channel());
            logger.info("["+channelId+"]加入客户端列表");
        }
    }
    /**
     * 移除客户端
     * @param channelId
     * @param
     */
    public synchronized void removeChannel(String channelId, ChannelHandlerContext ctx){
        //直接put 如果已经存在相当于其他地方登录，直接覆盖
       gateManager.remove(channelId);
        ctx.flush();
        ctx.close();
        logger.info("["+channelId+"]去除客户端列表");

    }
//    /**
//     * 根据sessionId获取SocketChannel
//     * @param sessionId
//     */
//    public SocketChannel getChannel(String sessionId){
//        if(StringUtils.isEmpty(sessionId)){
//            return null;
//        }
//        return gateManager.get(sessionId);
//    }
//
    /**
     * 新增gameSession
     * 如果已经存在了 很可能存在同一个ip用户又进行了其他账号的登录，这时直接覆盖
     * @param userId
     * @param gameSession
     */
    public synchronized void addUser(String userId,Object gameSession){
        if(gameSession != null){
            userManager.put(userId,gameSession);
        }
    }

    /**
     * 根据sessionId获取session
     * @param sessionId
     * @return
     */
    public Object getUser(String sessionId){
        if(StringUtils.isEmpty(sessionId)){
            return null;
        }
        return userManager.get(sessionId);
    }
//
//    /**
//     * 玩家离线,将玩家从gateManager中删掉
//     * @param uuid
//     */
//    public synchronized void removeChannel(String sessionId){
//        gateManager.remove(sessionId);
//        //同时 删除掉玩家的session信息
//        sessionManager.remove(sessionId);
//    }
//
    /**
     * 新增用户到玩家管理器
     * @param uuid
     * @param player
     */
    public synchronized void addPlayer(String uuid,ChannelHandlerContext ctx,Play player){

        if (playerManager.get(uuid)== null){
            if(player != null){
                session.put(player.getPlayName(),ctx.channel().id().toString());
                playerManager.put(uuid,player);
            }
        }

    }
    /**
     * replace更新客户
     * @param uuid
     * @param player
     */
    public synchronized void replacePlayer(String uuid,ChannelHandlerContext ctx,Play player){
            if(player != null){
                playerManager.put(uuid,player);
            }
    }
    /**
     * 根据用户Id从用户管理器中获取用户
     * @param uuid
     * @return
     */
    public Play getPlayer(String uuid){
        if(StringUtils.isEmpty(uuid)){
            return null;
        }
        return playerManager.get(uuid);
    }

    /**
     * 从玩家管理器中删除用户
     * @param uuid
     */
    public synchronized void removePlayer(String uuid){
        playerManager.remove(uuid);
    }
}